home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
cd2pcmt
/
source.lzh
/
convert.c
< prev
next >
Wrap
Text File
|
1997-10-02
|
13KB
|
532 lines
#include <TNB.H>
#include <pcmlib.h>
#include "cd2pcm.h"
#include "extern.h"
void convert( int len )
{
int rc;
if ( test_fg!=0 ){
write_size += len; /* DISKに書き込んだサイズ*/
return;
}
switch( pcm_mode ){
case 0:
/*------------ 44.1kHz 16BIT ステレオ ------------*/
/*---- Intel列びを直す ----*/
if ( sct_fg == 0 ){ /* SCSITAI 使用フラグ*/
printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
if ( dma_fg!=0 && mach2_fg==0 )
PLH2P16__( CDPCM_ptr+1,len );
else PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
}
/*---- レート変更 ----*/
if ( pcm_rate==22050 ){
printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
len = PCMHRATE_( CDPCM_ptr,len );
}
/*---- 書き込む ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCM_ptr, len );
if ( rc != len ){
printf("書き込みエラー\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
break;
case CONVERT_PCMA:
/*------------ 44.1kHz ADPCM ------------*/
/*---- Intel列びを直す ----*/
if ( sct_fg == 0 ){ /* SCSITAI 使用フラグ*/
printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
if ( dma_fg!=0 && mach2_fg==0 )
PLH2P16__( CDPCM_ptr+1,len );
else PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
}
/*---- レート変更 ----*/
if ( pcm_rate==22050 ){
printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
len = PCMHRATE_( CDPCM_ptr,len );
}
/*---- YM2608 ADPCM に変換 -----*/
printf_(" ★Convert [PCM -> YM2608 ADPCM]" CFC "\n" CUP);
PTOA_EXEC( CDPCM_ptr,CDPCM_ptr,len );
len/=4; // 同じアドレスでも大丈夫のはず
/*---- 書き込む ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCM_ptr, len );
if ( rc != len ){
printf("書き込みエラー\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
break;
case CONVERT_A88:
/*------------ 88.2kHz ADPCM ------------*/
/*---- Intel列びを直す ----*/
if ( sct_fg == 0 ){ /* SCSITAI 使用フラグ*/
printf_(" ★Convert [Intel -> Motorola]" CFC "\n" CUP);
if ( dma_fg!=0 && mach2_fg==0 )
PLH2P16__( CDPCM_ptr+1,len );
else PLH2P16( (void*)CDPCM_ptr,(void*)CDPCM_ptr,len );
}
/*---- レート変更 ----*/
printf_(" ★Convert [44.100kHz -> 88.200kHz]" CFC "\n" CUP );
len = PCMDRATE_( CDPCM_ptr,len,CDPCMM_ptr );
/*---- YM2608 ADPCM に変換 -----*/
printf_(" ★Convert [PCM -> YM2608 ADPCM]" CFC "\n" CUP);
PTOA_EXEC( CDPCMM_ptr,CDPCMM_ptr,len );
len/=4; // 同じアドレスでも大丈夫のはず
/*---- 書き込む ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCMM_ptr, len );
if ( rc != len ){
printf("書き込みエラー\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
break;
case CONVERT_WAVE:
/*------------ 44.1kHz 16BIT ステレオ ------------*/
/*---- レート変更 ----*/
if ( pcm_rate==22050 ){
printf_(" ★Convert [44.100kHz -> 22.050kHz]" CFC "\n" CUP );
len = PCMHRATE_( CDPCM_ptr,len );
}
/*---- 書き込む ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCM_ptr, len );
if ( rc != len ){
printf("書き込みエラー\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
break;
case CONVERT_PCMR:
case CONVERT_PCML:
case CONVERT_PCMM:
/*------------ 44.1kHz 16BIT モノラル ------------*/
/*---- Intel列びを直し、モノラルに ----*/
switch( pcm_mode ){
case CONVERT_PCMR:
printf_(" ★Convert [Intel stereo -> Motorola mono] (right only)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,2 );
break;
case CONVERT_PCML:
printf_(" ★Convert [Intel stereo -> Motorola mono] (left only)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,1 );
break;
case CONVERT_PCMM:
printf_(" ★Convert [Intel stereo -> Motorola mono] (mix)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,0 );
break;
}
///*---- ボリュームいじる ----*/
//len = PCMVOL( CDPCMM_ptr,CDPCM_ptr,len,waru,4 );
/*---- 書き込む ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCM_ptr, len );
if ( rc != len ){
printf("書き込みエラー\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
break;
case CONVERT_PCM15:
/*------------ 15.6kHz モノラル ------------*/
/*---- Intel列びを直し、モノラルに ----*/
switch( convert_mode ){
case CONVERT_R:
case CONVERT_AVE_R:
printf_(" ★Convert [Intel stereo -> Motorola mono] (right only)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,2 );
break;
case CONVERT_L:
case CONVERT_AVE_L:
printf_(" ★Convert [Intel stereo -> Motorola mono] (left only)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,1 );
break;
case CONVERT_M:
case CONVERT_AVE_M:
printf_(" ★Convert [Intel stereo -> Motorola mono] (mix)" CFC "\n" CUP);
len = PLH2PCMMONO( CDPCM_ptr,CDPCM_ptr,len,0 );
break;
}
/*---- 44.1kHz -> 15.6kHz & ボリュームいじる ----*/
switch( convert_mode ){
case CONVERT_AVE_R:
case CONVERT_AVE_L:
case CONVERT_AVE_M:
printf_(" ★Convert [44.100kHz -> %skHz] (supp.)" CFC "\n" CUP ,pcm_rate_str);
if ( waru==4 )
len = PCMFFREQ( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100);
else len = PCMFFREQVOL( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100,waru,4);
break;
case CONVERT_M:
case CONVERT_R:
case CONVERT_L:
printf_(" ★Convert [44.100kHz -> %skHz]" CFC "\n" CUP ,pcm_rate_str);
if ( waru==4 )
len = PCMFREQ( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100);
else len = PCMFREQVOL( (void*)CDPCMM_ptr,(void*)CDPCM_ptr,len,pcm_rate,44100,waru,4);
break;
}
if ( adpcm_flg == 0 ){
/*---- 15.6kHz 16BIT MONAURAL データ書き込み ----*/
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCMM_ptr, len );
} else {
/*---- ADPCM に変換、データ書き込み -----*/
printf_(" ★Convert [PCM -> ADPCM]" CFC "\n" CUP);
len=P162PCM( CDPCM_ptr,(void*)CDPCMM_ptr,len );
printf_(" ★Disk Writing" CFC "\n" CUP);
rc = WRITE( hdl, CDPCM_ptr, len );
}
if ( rc != len ) {
printf("書き込みに失敗しました。\n");
CLOSE(hdl);
EndtDisp(1);
}
write_size += len; /* DISKに書き込んだサイズ*/
}
return;
}
asm("
*****************************************************************
* Intel 44.1kHz 16BIT ステレオ *
* ↓ *
* Motorola 44.1kHz 16BIT モノラル *
*****************************************************************
_PLH2PCMMONO::
~src_ptr reg a5
~dest_ptr reg a4
~param reg d7
~src_size reg d6
* in 4(sp) pcm data(16bit) out data address (motorola)
* 8(sp) pcm data(16bit) in data address (intel)
* 12(sp) pcm data(16bit) data size(n byte)
* 16(sp) monoral mode 0=(L+R)/2,1=L,2=R,3=L+R
* out d0 pcm data(16bit) data size(n byte)
movem.l d1-d7/a0-a6,-(sp)
move.l 4*14+4(sp),~dest_ptr
move.l 4*14+8(sp),~src_ptr
move.l 4*14+12(sp),~src_size
move.l 4*14+16(sp),~param
andi.w #3,~param
lsr.l #2,~src_size
tst.l ~src_size
beq 9f
cmpi.w #2,~param
bhi PMONO_main_LR
beq PMONO_main_R
tst.w ~param
bne PMONO_main_L
PMONO_main_LRMIX:
@@:
move.w (~src_ptr)+,d0
ror.w #8,d0 *intel->moto
move.w (~src_ptr)+,d1
ror.w #8,d1 *intel->moto
ext.l d0
ext.l d1
add.l d1,d0
asr.l #1,d0
move.w d0,(~dest_ptr)+
subq.l #1,~src_size
bne @b
bra 9f
PMONO_main_L:
@@:
move.w (~src_ptr)+,d0
ror.w #8,d0 *intel->moto
move.w d0,(~dest_ptr)+
addq.w #2,~src_ptr
subq.l #1,~src_size
bne @b
bra 9f
PMONO_main_R:
@@:
addq.w #2,~src_ptr
move.w (~src_ptr)+,d0
ror.w #8,d0 *intel->moto
move.w d0,(~dest_ptr)+
subq.l #1,~src_size
bne @b
bra 9f
PMONO_main_LR:
@@:
move.w (~src_ptr)+,d0
ror.w #8,d0 *intel->moto
move.w (~src_ptr)+,d1
ror.w #8,d1 *intel->moto
add.w d1,d0
move.w d0,(~dest_ptr)+
subq.l #1,~src_size
bne @b
*bra 9f
9:
move.l 4*14+12(sp),d0
lsr.l #1,d0
movem.l (sp)+,d1-d7/a0-a6
rts
*****************************************************************
* Intel 16BIT ステレオ *
* ↓ *
* Motorola 16BIT ステレオ *
*****************************************************************
_PLH2P16__:
* in 4(sp) pcm data(16bit) data address (変換後は -2 からが)
* 8(sp) pcm data(16bit) data size(n byte)
*
* out d0 pcm data(16bit) data size(n byte)
lea $CBC.w,a1
moveq #$82,d0 *IOCS _B_BPEEK
trap #15
cmpi.b #3+1,d0
bcs _PLH2P16_M0
*--- MPU 4~
move.l 4(sp),a0
move.l 8(sp),d0
@@:
cmpi.l #128,d0
bcs _PLH2P16_EE
.rept 4 * 128byte 分処理
move.b 1(a0),-1(a0)
move.b 3(a0),1(a0)
move.b 5(a0),3(a0)
move.b 7(a0),5(a0)
move.b 9(a0),7(a0)
move.b 11(a0),9(a0)
move.b 13(a0),11(a0)
move.b 15(a0),13(a0)
move.b 17(a0),15(a0)
move.b 19(a0),17(a0)
move.b 21(a0),19(a0)
move.b 23(a0),21(a0)
move.b 25(a0),23(a0)
move.b 27(a0),25(a0)
move.b 29(a0),27(a0)
move.b 31(a0),29(a0)
lea 2*16(a0),a0
.endm
sub.l #128,d0
bra @b
_PLH2P16_M0:
*--- MPU 0 3
move.l 4(sp),a0
move.l 8(sp),d0
@@:
cmpi.l #256,d0
bcs _PLH2P16_EE
.rept 8 * 256byte 分処理
movep.l 1(a0),d1 *4
movep.l d1,-1(a0)
movep.l 9(a0),d1 *4
movep.l d1,7(a0)
movep.l 17(a0),d1 *4
movep.l d1,15(a0)
movep.l 25(a0),d1 *4
movep.l d1,23(a0)
lea 2*16(a0),a0
.endm
sub.l #256,d0
bra @b
_PLH2P16_EE:
tst.l d0
beq 1f
@@:
move.b 1(a0),-1(a0)
addq.l #2,a0
subq.l #2,d0 * byte なので...
bne @b
1:
move.l 8(sp),d0
rts
*****************************************************************
* ステレオ half rate *
*****************************************************************
_PCMHRATE_::
* in 4(sp) pcm data(16bit) data address
* 8(sp) pcm data(16bit) data size(n byte)
*
* out d0 pcm data(16bit) data size(n byte)
move.l 4(sp),a0
movea.l a0,a1
move.l 8(sp),d0
lsr.l #3,d0 * 1/8 。4の倍数のはず..
@@:
move.l (a0),(a1)+
addq.l #8,a0
subq.l #1,d0
bne @b
move.l 8(sp),d0
lsr.l #1,d0 * 1/2 。
rts
*****************************************************************
* ステレオ double rate *
*****************************************************************
_PCMDRATE_::
* in 4(sp) pcm data(16bit) data address
* 8(sp) pcm data(16bit) data size(n byte)
* 12(sp) out 用pcm data address
*
* out d0 pcm data(16bit) data size(n byte)
movea.l 4(sp),a0
movea.l 12(sp),a1
move.l 8(sp),d0
lsr.l #2,d0 * 1/4 。4の倍数のはず..
@@:
move.w (a0)+,d1
move.w (a0)+,d2
move.w d1,(a1)+
move.w d2,(a1)+
move.w d1,(a1)+
move.w d2,(a1)+
subq.l #1,d0
bne @b
move.l 8(sp),d0
add.l d0,d0 * 1/2 。
rts
*****************************************************************
* YM ADPCM 可!! *
*****************************************************************
*機能: PCM->ADPCM変換用のバッファを作成します。
* これを実行しないと変換ができません。
_PTOA_MAKE_BUFFER::
jbra ptoa_make_buffer
* rts
_PTOA_INIT::
move.l #-1,d0
jbra ptoa_init
* rts
_PTOA_EXEC::
move.l 4(sp),a1 * ADPCMのアドレス
move.l 8(sp),a0 * PCMのアドレス
move.l 12(sp),d0 * PCMのサイズ
jbra ptoa_exec * PCM->ADPCM変換を実行
* rts
");
/**********************************
名前計算
**********************************/
char *NameCenter(na)
unsigned char *na;
{
#define jstrlen_(SR) \
({ char *st_=(SR); int l_=0,c_; \
while( c_=*(st_++) ){ \
l_++; \
if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ \
if ( c_>0x80 && c_<0xF0 ) \
l_++; \
st_++; \
} \
} (l_); \
})
int i,l,c;
static unsigned char buf[64];
unsigned char *s;
unsigned char *ac=buf;
i=0;
s=(void*)CDCTNAME(-1);
if ( s!=0 && s[0]!=' ' ){ // CD名
l=jstrlen_(na);
for(;i<(36-l)/2;i++)
*ac++=0x20;
}
for(;i<36-1+1;){
c=*na++;
if ( c==0 )
break;
i++;
*ac++=c;
if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
i++;
*ac++=*na++;
}
}
for(;i<36-1+1;i++)
*ac++=0x20;
*ac=0;
return(buf);
}
/********************************************************
CDC連絡
********************************************************/
int CDCID()
{
if ( CDC_CHK()==0 )
return(-1);
if ( CDC_VERSION()<0x109 )
return(-1);
if ( CDC_POWER(-1)==0 )
return(-1);
if ( CDC_CHGLUN(-1)>=100 ) // JUKE BOX になっている
return(-1);
return( CDC_SCSIID() );
}
/*+++++++*/
char *CDCTNAME(t)
int t;
{
struct CDC_TRACKS_PTR *TP;
struct CDC_ATRACK_PTR *AP;
char *s;
if ( CDCID()<0 )
return(0);
if ( t<0 ){
TP=CDC_TRACKS();
s=(void*)&(TP->CDNAME);
} else {
AP=CDC_ATRACK(t);
s=AP->NAME;
}
if ( *s==0 )
return(0);
return(s);
}
/*+++++++*/
void CDCRESET()
{
if ( CDCID()<0 )
return;
CDC_RELED();
}